package visiopuce.service;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.NonUniqueResultException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;

import visiopuce.HibernateUtil;
import visiopuce.DAO.UtilisateurDAO;
import visiopuce.DAO.UtilisateurDAOImpl;
import visiopuce.objets.Utilisateur;

public class UtilisateurServiceImpl implements UtilisateurService {

	private static final Log log = LogFactory.getLog(UtilisateurService.class);

	private UtilisateurDAO utilisateurDAO = UtilisateurDAOImpl.getInstance();

	private static Utilisateur user;

	/** Constructeur priv� */
	private UtilisateurServiceImpl() {
	}

	/** Instance unique non pr�initialis�e */
	private static UtilisateurServiceImpl INSTANCE = null;

	/** Point d'acc�s pour l'instance unique du singleton */
	public static UtilisateurService getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new UtilisateurServiceImpl();
			user = new Utilisateur();
			user.setNom("");
			user.setPrenom("");
		}
		return INSTANCE;
	}

	/**
	 * Permet de récupérer l'utilisateur par son nom et son mot de passe.
	 * 
	 * @param username
	 * @param password
	 * @return l'utilisateur
	 */
	public Utilisateur utilisateurExiste(String login, String password) {
		Utilisateur utilisateur = null;
		try {
			HibernateUtil.beginTransaction();
			utilisateur = utilisateurDAO.getUtilisateurByLogin(login);
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (NonUniqueResultException ex) {
			System.out.println("Plusieurs utilisateurs ont le login " + login);
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		if (utilisateur == null || !(utilisateur.getPwd().equals(encode2md5(password)))) {
			utilisateur = null;
		}

		return utilisateur;
	}

	private String encode2md5(String password) {
		String digest = null;
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] hash = md.digest(password.getBytes("UTF-8"));

			// converting byte array to Hexadecimal String
			StringBuilder sb = new StringBuilder(2 * hash.length);
			for (byte b : hash) {
				sb.append(String.format("%02x", b & 0xff));
			}

			digest = sb.toString();

		} catch (UnsupportedEncodingException ex) {
			log.error(ex);
		} catch (NoSuchAlgorithmException ex) {
			log.error(ex);
		}
		return digest;
	}

	public ArrayList<Utilisateur> getPrescripteurs() {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		utilisateurs.add(user);
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getPrescripteurs());
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	public ArrayList<Utilisateur> getBiologisteByTypeAnalyse(Integer idTypeAnalyse) {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		utilisateurs.add(user);
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getBiologisteByTypeAnalyse(idTypeAnalyse));
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	@Override
	public Utilisateur getUtilisateurByNom(String nom) {
		Utilisateur utilisateur = null;
		try {
			if (nom.contains("Hacquet") || nom.contains("Haquet")) {
				nom = "Haquet";
			}
			if (nom.contains("Walther Lourie") || nom.contains("Walther")) {
				nom = "Walther";
			}
			if (nom.contains("sarda") || nom.contains("Sarda")) {
				nom = "sarda";
			}
			if (nom.contains("Pinson")) {
				nom = "Pinson";
			}
			if (nom.contains("Willems")) {
				nom = "Willems";
			}
			if (nom.contains("Sultan")) {
				nom = "Sultan";
			}
			if (nom.contains("Espitalier")) {
				nom = "Espitalier";
			}
			if (nom.contains("Dhenin") || nom.contains("Rebufa")) {
				nom = "Dhenin";
			}
			if (nom.contains("Coubes")) {
				nom = "Coubes";
			}
			if (nom.contains("CPDP") || nom.contains("DPDP")) {
				nom = "CPDPN";
			}
			if (nom.contains("Flandrin")) {
				nom = "Flandrin";
			}
			if (nom.contains("Vintejoux")) {
				nom = "Vintejoux";
			}
			if (nom.contains("Burlet")) {
				nom = "Burlet";
			}
			if (nom.contains("Begue")) {
				nom = "Begue";
			}
			if (nom.contains("Coudane")) {
				nom = "Coudane";
			}
			if (nom.contains("Dumont")) {
				nom = "Dumont";
			}
			HibernateUtil.beginTransaction();
			utilisateur = utilisateurDAO.getUtilisateurByNom(nom);
			HibernateUtil.commitTransaction();
			
			
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateur;
	}

	@Override
	public Utilisateur getUtilisateurById(int idUser) {
		Utilisateur u = null;
		HibernateUtil.beginTransaction();
		u = utilisateurDAO.findByID(Utilisateur.class, idUser);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return u;
	}

	@Override
	public ArrayList<Utilisateur> getAnnotateurs() {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		utilisateurs.add(user);
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getAnnotateurs());
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	@Override
	public Utilisateur getAnnotateurByIdPuce(Integer idPuce) {
		Utilisateur utilisateur = null;
		try {
			HibernateUtil.beginTransaction();
			utilisateur = utilisateurDAO.getAnnotateurByIdPuce(idPuce);
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateur;
	}

	@Override
	public Utilisateur getSignataireByIdPuce(Integer idPuce) {
		Utilisateur utilisateur = null;
		try {
			HibernateUtil.beginTransaction();
			utilisateur = utilisateurDAO.getSignataireByIdPuce(idPuce);
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateur;
	}

	@Override
	public ArrayList<Utilisateur> getVerificateursqPCR() {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		utilisateurs.add(user);
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getVerificateursqPCR());
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	@Override
	public ArrayList<Utilisateur> getTechnicienneByTypeAnalyse(Integer idTypeAnalyse) {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		utilisateurs.add(user);
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getTechnicienneByTypeAnalyse(idTypeAnalyse));
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	@Override
	public List<Utilisateur> getUtilisateurs() {
		ArrayList<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
		try {
			HibernateUtil.beginTransaction();
			utilisateurs.addAll(utilisateurDAO.getUtilisateurs());
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		} catch (HibernateException ex) {
			System.out.println("Erreur hibernate : ");
			ex.printStackTrace();
		}
		return utilisateurs;
	}

	// @Override
	// public ArrayList<Utilisateur> getUtilisateursByType(String type, int
	// idGroupe) {
	// ArrayList<Utilisateur> utilisateurs = null;
	// try {
	// HibernateUtil.beginTransaction();
	// utilisateurs = utilisateurDAO.getUtilisateursByType(type, idGroupe);
	// HibernateUtil.commitTransaction();
	// } catch (HibernateException ex) {
	// System.out.println("Erreur hibernate : ");
	// ex.printStackTrace();
	// }
	// return utilisateurs;
	// }
}